package com.my.springboot.tuling.concurrent.cas;


import com.my.springboot.tuling.jvm.concurrency.factory.UnsafeFactory;
import sun.misc.Unsafe;

/**
 * lock前缀指令，类似内存屏障，高效保证原子性
 * 缺陷：
 * 自旋 CAS 长时间地不成功，则会给 CPU 带来非常大的开销
 * 只能保证一个共享变量原子操作
 * ABA 问题：当有多个线程对一个原子类进行操作的时候，某个线程在短时间内将原子类的值A修改为B，又马
 * 上将其修改为A，此时其他线程不感知，还是会修改成功。
 */
public class CASTest {
    public static void main(String[] args) {
        Entity entity  = new Entity();
        Unsafe unsafe = UnsafeFactory.getUnsafe();
        long offset = UnsafeFactory.getFieldOffset(unsafe, Entity.class,"x");
        // 偏移量：对象头占8字节，int类型，指针占4个字节
        System.out.println("偏移量：" + offset);
        boolean successful;
        // 4个参数分别是：对象实例、字段的内存偏移量、字段期望值、字段新值
        successful = unsafe.compareAndSwapInt(entity, offset, 0, 3);
        System.out.println(successful + "\t" + entity.x);

        successful = unsafe.compareAndSwapInt(entity, offset, 3, 5);
        System.out.println(successful + "\t" + entity.x);

        successful = unsafe.compareAndSwapInt(entity, offset, 3, 8);
        System.out.println(successful + "\t" + entity.x);
    }
}

class Entity{
    int x;
}